package 简单.数学;

/**
 * 给定一个非负整数 num，反复将各个位上的数字相加，直到结果为一位数。返回这个结果。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/add-digits/
 */
public class 各位相加_258 {

    public static void main(String[] args) {

        System.out.println(efficientAddDigits(4589));

    }

    /**
     * 模拟
     *
     * @param num
     * @return
     */
    public static int addDigits(int num) {
        while (num > 9) {
            int temp = 0;
            while (num > 0) {
                temp += num % 10;
                num /= 10;
            }
            num = temp;
        }
        return num;
    }

    public static int addDigits2(int num) {
        if (num == 0) {
            return 0;
        }
        return num % 9 == 0 ? 9 : num % 9;
    }

    /**
     * 数学
     * 数根
     * 定义：
     * 将一正整数的各个位数相加(即横向相加)后，若加完后的值大于等于10的话，
     * 则继续将各位数进行横向相加直到其值小于十为止所得到的数，即为数根。换
     * 句话说，数根是将一数字重复做其数字之和，直到其值小于十为止，则所得的值为
     * 该数的数根。例如54817的数根为7，因为5+4+8+1+7=25，25大于10则再加一次，
     * 2+5=7，7小于十，则7为54817的数根。
     * 性质：
     * x+9与x的数根相同，即一个数加9后它的数根不变
     * 规律
     * 1 2 3 4 5 6 7 8 9 10 11 12 13
     * *                  1  2  3  4
     * 如果是9的倍数那么返回9
     *
     * @param num
     * @return
     */
    public static int efficientAddDigits(int num) {
        return (num - 1) % 9 + 1;
    }

}
